package books.new_to_old

fun main(args: Array<String>) {

    //1.注解属性


    //2.元注解
    AnnotationRetention.RUNTIME //可以在运行时通过发射获取
    AnnotationRetention.BINARY  //记录在class字节码
    AnnotationRetention.SOURCE  //保留在源码

    //3.注解反射
    A::class.annotations.forEach(::println)


}

//可重复注解,java8之前只能是AnnotationRetention.SOURCE
@Repeatable
//将被文档工具提取到 API 文档中,使用 Dokka 工具生成文档
@MustBeDocumented
@Retention(AnnotationRetention.SOURCE)
@Target(AnnotationTarget.CLASS, AnnotationTarget.FIELD)
annotation class TestRetention(val name: String,
                               val age: Int = 33)

@TestRetention("呵呵呵")
@TestRetention("哈哈哈", 333)
class B


@TestVararg("java", "kotlin")
class A {

    //将一个注解作为另一个注解的属性值，那么在使用注解时不需要以＠作为前缀。做一般创建对象使用
    @TestProperty(name = "哈哈", test = Test(), array = ["1", "2"])
    fun test() {
    }
}

@Test
private fun test(): String {
    return ""
}

//标记注解,没有定义属性
annotation class Test

/**
 * 对应于 Java 基本类型的类（如 Int Long 等）
字符串
类
枚举
其他注解
上面各种类型的数组
 */
//元数据注解
@Retention(AnnotationRetention.RUNTIME)
annotation class TestProperty(
        val name: String,
        val age: Int = 33,
        val test: Test,
        val array: Array<String>)

@Retention(AnnotationRetention.RUNTIME)
annotation class TestVararg(vararg val something: String)